Skip to main content

Koa

Koa的三个模块

  • Application: 基本服务器框架
  • Context: 服务器框架基本数据结构的封装,用以 http 请求解析及响应
  • Middleware: 中间件,也是洋葱模型的核心机制

构建 Application

  • 首先完成 Appliacation 的大体框架:
    • app.listen: 处理请求及响应,并且监听端口
    • app.use: 中间件函数,处理请求并完成响应
const http = require("http");

class Application {
constructor() {
this.middleware = null;
}

listen(...args) {
const server = http.createServer(this.middleware);
server.listen(...args);
}

// 这里依旧调用的是原生 http.createServer 的回调函数
use(middleware) {
this.middleware = middleware;
}
}
  • 此时调用 Application 启动服务的代码如下:

const app = new Appliacation();

app.use((req, res) => {
res.end("hello, world");
});

app.listen(3000);

  • 由于 app.use 的回调函数依然是原生的 http.crateServer 回调函数,而在 koa 中回调参数是一个 Context 对象。

Koa 的中间件机制

Koa 中间件的工作原理是整个框架的核心。中间件是一些函数,这些函数能够访问请求对象(request)、响应对象(response)以及应用程序的请求/响应循环中的下一个中间件。在 Koa 中,中间件的执行顺序遵循一种称为 洋葱模型 的模式。

中间件的执行顺序

  • 洋葱模型:当一个请求进入 Koa 应用时,它会从第一个中间件开始,经过每个中间件,直到找到合适的处理程序。然后,响应会回溯经过每个经过的中间件,直到最外层。这种机制就像剥洋葱一样,外层包裹着内层,因此被称为 洋葱模型

  • 中间件的添加:在 Koa 中,中间件是使用 app.use(middleware) 添加的。中间件被添加的顺序决定了它们被执行的顺序。

next 函数的作用

  • 控制流:next 函数是一个函数,当调用时,它将控制转移到下一个中间件。只有当 next() 被调用时,后续的中间件才会执行。

  • 异步执行:next 返回一个 Promise,这意味着你可以在中间件中使用异步函数。这允许你在当前中间件中执行代码,暂停执行直到下一个中间件完成,然后再恢复当前中间件的执行。